iT邦幫忙

2023 iThome 鐵人賽

DAY 29
1
AI & Data

AIoT的藍藥丸與紅藥丸,你選哪個?系列 第 55

Day 29:物聯網幽靈的RESTful API 謎題.芝麻開門

  • 分享至 

  • xImage
  •  

前情提要

https://ithelp.ithome.com.tw/upload/images/20231014/20162501dZqWaj2gq3.jpg
  在Day 28:Flask計畫.RESTful API 之門中,你們拆開風扇後發現裡面居然藏著一塊電路板!原來,這就是你們在找的隱藏的電路板。你們終於可以用電路板來欺騙門禁系統,讓門禁系統以為你們是合法的使用者,這樣你們就可以逃出密室,看到大漂亮了!
  你們發現這個門禁系統的 Flask 容器沒有設定密碼或驗證機制,所以你們打算用Docker直接訪問它的 Web 介面,然後用 POST 請求來傳送開門指令。毛帽哥提議用「requests 發送HTTP請求」來找出IPPORT,雖然不是最有效率的方法,但你們只好硬著頭皮上了。
  就在你們看到螢幕上跑出「Success!」,準備迎接勝利的時候,卻發現門沒有打開,取而代之的是HTML畫面中跳出的提示訊息:

物聯網幽靈的挑戰,用以下的線索,大喊芝麻開門吧!

  • Flask 容器的 IP 位址和 PORT 號碼是 192.168.1.100:5000
  • Flask 容器的密碼或驗證機制是 Basic Auth,帳號是 admin,密碼是 123456
  • Flask 容器的 API 路由是 /open_door

  「看來大漂亮是要我們用Flask來建立一個RESTful API……」眼鏡仔大嘆一口氣,「想不到還沒辦法打開門……」
  「那她要我們建立什麼RESTful API?」

RESTful API 就是一種API的架構風格,因為有更加清晰、簡潔、易於使用和維護的特色,可以讓不同的軟體和程式可以更方便的溝通。
關於「使用 Flask 框架建立 RESTful API」可以參考氣球寫的這篇文章

撰寫Flask Web來存取Mongo DB

https://ithelp.ithome.com.tw/upload/images/20231014/20162501cfK0zJ9aqN.jpg
  你們在房間翻找著大漂亮還有沒有留下其他線索,結果在她的抽屜找到一份文件,是宿舍的訪客名單。
  「你們看!我找到這個」你喊著眼鏡仔跟毛帽哥過來看「看來大漂亮要我們建立的是──管理宿舍訪客名單的API。」
  「真的噎!這裡還有寫宿舍訪客名單API的需求規格!」毛帽哥說。

宿舍訪客名單 API 的需求規格

宿舍訪客名單包括:姓名、年齡、性別、電話、地址等欄位。

  • API 必須支援以下四種 HTTP 方法:
  • GET:取得所有或特定的會員資料。
  • POST:新增一筆會員資料。
  • PUT:修改一筆會員資料。
  • DELETE:刪除一筆會員資料。
  • API 必須回傳 JSON 格式的資料,並且包含狀態碼和訊息。
  • API 必須使用 MongoDB 資料庫來儲存和操作會員資料。

  「看來,我們要按照這個需求規格,用Flask來實作這個API,然後用Postman來測試它的功能和效能。」
  「但她要我們做這個幹嘛?我們就算做出來,也還是出不去啊!」毛帽哥說。
  「說不定她是為了給我們一個機會,在宿舍訪客名單上加入我們三個的資料?」你突然靈機一動,「如果我們也在宿舍名單上,那就代表我們不是違規進來的,就可以正大光明離開女生宿舍了!」

  「聽起來有道理噎!」眼鏡哥點頭表示認同,「那我們就用 Flask 跟 PyMongo 來寫吧!」
  「那要怎麼開始?」你已經躍躍欲試。

關於「Flask-PyMongo」可以參考dcrosta寫的這篇文章

宿舍訪客名單

https://ithelp.ithome.com.tw/upload/images/20231014/20162501BpWIsCXk0A.jpg

我們可以把這個程式碼比喻成一個宿舍管理員,他負責以下的工作:

  • 零、設定環境
  • 一、引入 Flask 和 PyMongo 套件
    這就像是管理員要先準備好一些工具,例如一本筆記本(Flask)和一個資料庫(PyMongo),才能開始工作。
  • 二、建立 Flask 應用程式
    這就像是管理員要先開啟筆記本,才能記錄訪客的資料。
  • 三、設定 MongoDB 連線資訊
    這就像是管理員要先連接到資料庫,才能存取訪客的資料。
  • 四、建立 HTTPBasicAuth 物件
    這就像是管理員要先準備好一個驗證機制,才能確保只有合法的使用者才能使用他的服務。
  • 五、設定帳號密碼驗證機制
    這就像是管理員要先設定好一組帳號密碼,並且在每次有人要使用他的服務時,都要先檢查他們是否提供正確的帳號密碼。
  • 六、定義路由和 HTTP 方法,並用 auth.login_required decorator 要求驗證
    這就像是管理員要先定義好一些規則,例如:
    • 如果有人要查詢或新增訪客資料,他們要用網址 http://192.168.1.100:5000/visitors 來跟管理員聯絡,並且告訴他們是要查詢(GET)還是新增(POST)。
    • 如果有人要修改或刪除特定的訪客資料,他們要用網址 http://192.168.1.100:5000/visitors/ 來跟管理員聯絡,並且告訴他們是要修改(PUT)還是刪除(DELETE),以及要操作哪一筆資料(id)。
    • 不管是哪種操作,他們都要先通過驗證(auth.login_required),才能繼續下一步。
  • 6-1 如果是 GET 方法,則取得所有或特定的訪客資料:
    這就像是管理員要根據使用者的需求,從資料庫中找出相對應的訪客資料,並且回傳給使用者。具體來說:
    • 取得查詢參數 name,如果沒有則預設為空字串:
      這就像是管理員要先問使用者想查詢哪一位訪客的名字,如果使用者沒有說明,就預設為空字串。
    • 如果有 name,則根據 name 查詢特定的訪客資料:
      這就像是管理員根據使用者提供的名字,在資料庫中找出符合的訪客資料。
      • 如果找不到,則回傳 404 狀態碼和錯誤訊息:
        這就像是管理員告訴使用者,他沒有找到這位訪客的資料,並且用 404 這個代碼表示找不到的意思。
      • 如果找到,則回傳 200 狀態碼和訪客資料:
        這就像是管理員告訴使用者,他已經找到這位訪客的資料,並且用 200 這個代碼表示成功的意思,然後把訪客的資料回傳給使用者。
    • 如果沒有 name,則取得所有的訪客資料:
      這就像是管理員根據使用者沒有提供名字的情況,在資料庫中找出所有的訪客資料。
      • 將查詢結果轉換為列表:
        這就像是管理員把找到的所有訪客資料整理成一個列表,方便回傳。
      • 回傳 200 狀態碼和訪客列表:
        這就像是管理員告訴使用者,他已經找到所有的訪客資料,並且用 200 這個代碼表示成功的意思,然後把訪客列表回傳給使用者。
  • 6-2 如果是 POST 方法,則新增一筆訪客資料:
    這就像是管理員要根據使用者提供的資料,往資料庫中新增一筆訪客資料,並且回傳結果給使用者。具體來說:
    • 取得請求中的 JSON 資料:
      這就像是管理員要先從使用者那裡收到一個 JSON 格式的資料,裡面包含了要新增的訪客的相關資訊。
    • 檢查 JSON 資料是否包含所有必要的欄位:
      這就像是管理員要先檢查使用者提供的資料是否完整,是否包含了姓名、年齡、性別、電話、地址等欄位。
      • 執行 insert_one 新增訪客資料到 MongoDB 中:
        這就像是管理員在確認資料完整後,把它寫入到資料庫中,並且取得新增的訪客 id。
      • 回傳 201 狀態碼和新增的訪客 id:
        這就像是管理員告訴使用者,他成功地新增了一筆訪客資料,並且用 201 這個代碼表示新增的意思,然後把新增的訪客 id 回傳給使用者。
    • 如果 JSON 資料不完整,則回傳 400 狀態碼和錯誤訊息:
      這就像是管理員在發現資料不完整或無效時,告訴使用者他無法新增這筆資料,並且用 400 這個代碼表示錯誤的意思,然後把錯誤訊息回傳給使用者。
  • 七、定義路由和 HTTP 方法,用變數 id 傳遞參數,並用 auth.login_required decorator 要求驗證
    這就像是管理員要先定義好另一種規則,例如:
  • 八、啟動 Flask 應用程式,並指定主機和埠號

傳送門

撰寫Flask Web來存取Mongo DB (1)討論如何實作以下內容:

  • 零、設定環境
  • 一、引入 Flask 和 PyMongo 套件
  • 二、建立 Flask 應用程式
  • 三、設定 MongoDB 連線資訊

撰寫Flask Web來存取Mongo DB (2)討論如何實作以下內容:

  • 四、建立 HTTPBasicAuth 物件
  • 五、設定帳號密碼驗證機制
  • 六、定義路由和 HTTP 方法,並使用 auth.login_required 要求驗證

撰寫Flask Web來存取Mongo DB (3)討論如何實作以下內容:

  • 六、定義路由和 HTTP 方法,並用 auth.login_required decorator 要求驗證
    • 6-1 如果是 GET 方法,則取得所有或特定的訪客資料
    • 6-2 如果是 POST 方法,則新增一筆訪客資料

撰寫Flask Web來存取Mongo DB (4)討論如何實作以下內容:

  • 七、定義路由和 HTTP 方法,用變數 id 傳遞參數,並用 auth.login_required decorator 要求驗證
    • 7-1 如果是 PUT 方法,則修改一筆訪客資料
    • 7-2 如果是 DELETE 方法,則刪除一筆訪客資料

撰寫Flask Web來存取Mongo DB (5)討論如何實作以下內容:

  • 八、啟動 Flask 應用程式,並指定主機和埠號

上一篇
Day 28:Flask計畫.RESTful API 之門
下一篇
補充:撰寫Flask Web來存取Mongo DB (1)
系列文
AIoT的藍藥丸與紅藥丸,你選哪個?62
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言